package ch.gibb.learnit.client.controllers;

import ch.gibb.learnit.client.util.soap.User;
import org.apache.log4j.Logger;

/**
 * Controller to manage all actions in the users profile
 *
 * @author Bernard Jaquet
 * @version 1.0
 */
public class ProfileAction extends MasterAction {

    //OUT
    private String firstName;
    private String surName;
    private String mail;
    private String notifications;


    //IN
    private String form;
    private String oldPassword;
    private String newPassord;
    private String repeadPassword;
    private String sendNotifications;
    private String newFirstname;
    private String newSurname;

    //Class
    private final Logger masterlogger = Logger.getLogger(ProfileAction.class);

    @Override
    public int openPage() {
        //Sets the name of the page
        super.title = "Profil";

        // checks if a user is logged in
        if(!loginCheck())
            return 403;

        // Logic to update notifications
        if(form != null && form.equals("notifications")) {
            User user = getUser();
            if(user == null) {
                getErrors().addMessage("Wegen eines interen Fehlers konnten die Benutzerdaten nicht gelesen werden");
                return 0;
            }
            user.setNotification((sendNotifications != null && !sendNotifications.equals("")));
            if(client.updateUser(user))
                getSuccess().addMessage("Die Notfikationen wurden aktualisiert");
            else
                getErrors().addMessage("Wegen eines interen Fehlers konnte die Notikikation nicht aktualisiert werden");
        }

        // Logic to reset Password
        if(form != null && form.equals("password")){
            User tmp = factory.createUser();
            User user = getUser();
            if(user == null) {
                getErrors().addMessage("Wegen eines interen Fehlers konnten die Benutzerdaten nicht gelesen werden");
                return 0;
            }
            tmp.setEmail(user.getEmail());
            tmp.setPw(factory.createUserPw(oldPassword));
            if(client.login(tmp) == -1) {
                getErrors().addMessage("Passwort ist nicht korrekt");
                return 0;
            }
            if(newPassord == null){
                getErrors().addMessage("Bitte neues Passwort angeben");
                return 0;
            }
            if(!newPassord.equals(repeadPassword)) {
                getErrors().addMessage("Bitte Passwort wiederholen");
                return 0;
            }
            if(client.resetPassword(user, newPassord))
                getSuccess().addMessage("Passwort wurde neu gesetzt");
            else
                getErrors().addMessage("Wegen eines internen Fehlers konnte das Passwort nicht neu gesetzt werden");
        }

        // Logic to change user data
        if(form != null && form.equals("names")){
            User user = getUser();
            if(user == null) {
                getErrors().addMessage("Wegen eines interen Fehlers konnten die Benutzerdaten nicht gelesen werden");
                return 0;
            }
            user.setVorname(factory.createUserVorname(newFirstname));
            user.setNachname(factory.createUserNachname(newSurname));
            if(client.updateUser(user))
                getSuccess().addMessage("Die Daten wurden erfolgreich aktualisiert");
            else
                getErrors().addMessage("Wegen eines internen Fehlers konnten die Daten nicht aktualisiert werden");
        }


        // Get all needed information about the user
        try {
            User user = getUser();
            if(user == null) {
                getErrors().addMessage("Wegen eines interen Fehlers konnten die Benutzerdaten nicht gelesen werden");
                return 0;
            }
            firstName = user.getVorname().getValue();
            surName = user.getNachname().getValue();
            mail = user.getEmail().getValue();
            notifications = (user.isNotification() ? "true" : null);
            super.title += " von " +firstName + " " + surName;
        } catch (Exception e) {
            getErrors().addMessage("Profil konnte wegen eines internen Fehlers nicht geladen werden.");
            masterlogger.error("Could not get User because " + e.getMessage(), e);
        }

        return 0;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getSurName() {
        return surName;
    }

    public void setSurName(String surName) {
        this.surName = surName;
    }

    public String getMail() {
        return mail;
    }

    public void setMail(String mail) {
        this.mail = mail;
    }

    public String getNotifications() {
        return notifications;
    }

    public void setNotifications(String notifications) {
        this.notifications = notifications;
    }

    public String getForm() {
        return form;
    }

    public void setForm(String form) {
        this.form = form;
    }

    public String getOldPassword() {
        return oldPassword;
    }

    public void setOldPassword(String oldPassword) {
        this.oldPassword = oldPassword;
    }

    public String getNewPassord() {
        return newPassord;
    }

    public void setNewPassord(String newPassord) {
        this.newPassord = newPassord;
    }

    public String getRepeadPassword() {
        return repeadPassword;
    }

    public void setRepeadPassword(String repeadPassword) {
        this.repeadPassword = repeadPassword;
    }

    public String getSendNotifications() {
        return sendNotifications;
    }

    public void setSendNotifications(String sendNotifications) {
        this.sendNotifications = sendNotifications;
    }

    public String getNewFirstname() {
        return newFirstname;
    }

    public void setNewFirstname(String newFirstname) {
        this.newFirstname = newFirstname;
    }

    public String getNewSurname() {
        return newSurname;
    }

    public void setNewSurname(String newSurname) {
        this.newSurname = newSurname;
    }
}
